<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>02.预解析</title>
  </head>

  <body>

  </body>
  <script>
    /* 
    一.预解析：JavaScript 代码是由浏览器中的 JavaScript 解析器来执行的。JavaScript 解析器在运行
              JavaScript 代码的时候分为两步：预解析和代码执行。
       1.1 预解析 
       1.2 代码执行
    二.预解析分为变量预解析和函数预解析
       2.1  变量预解析 (变量提升) ：变量的声明会被提升到当前作用域的最上面，变量的赋值不会提升。
       2.2  函数预解析 (函数提升):函数的声明会被提升到当前作用域的最上面，但是不会调用函数
    */
    //问题二：变量提升
    //console.log(num); // 结果是多少？undefined
    //var num = 10; // ？

    //变量预解析后执行过程
    var num;
    console.log(num); //undefined
    num = 10;

    console.log("------------------------------------------------");
    //问题四：
    //func(); //Uncaught TypeError: func is not a function

    var func = function () {
      console.log(22);
    }

    //变量提升执行过程
    var func;
    func();
    func = function () {
      console.log(22); //Uncaught TypeError: func is not a function
    }


    console.log("------------------------------------------------");
    //问题三：
    fn();

    function fn() {
      console.log(11); //11
    }

    //函数提升执行过程
    function fn() {
      console.log(11); //11
    }
    fn();
  </script>

</html>